package j.framework.core.entity;

import j.data.ActionResult;
import j.framework.core.LoginUser;
import j.util.jdbc.JdbcTemplate;

import java.util.Map;

/**
 * 实体触发器，在增加、修改、删除前后均可拦截
 * 总体思路：增加、修改、删除前可对要操作的数据进行二次加工，修改，返回boolean值，若为true，继续执行，若为false，则不再执行
 * 也可抛出ServiceException异常
 * 实现类必须有一个没有参数的构造器
 * User: jason
 * Date: 2015/3/10 11:13
 */
public interface EntityTrigger {
    /**
     * 当显示增加、修改实体页面时显示
     * 可往entityData数据池中增加数据，这些数据将会回传到页面上
     * @param user 当前登录对象
     * @param e 实体配置
     * @param forInsert true为增加实体，false为修改实体
     * @param paramData 前台所传的参数
     * @param entityData 若为修改，则为数据为中所存数据，若增加，则为空
     * @return 是否继续
     */
    boolean whenShowEditUI(LoginUser user, Entity e, boolean forInsert, Map<String, String> paramData, Map<String, Object> entityData);

    /**
     * 增加前所执行，可通过向ActionResult中增加错误，或抛出异常
     * @param user 当前登录对象
     * @param e 实体配置
     * @param paramData 操作数据
     * @param jdbcTemplate jdbc
     * @param ar 操作结果
     * @return false，则不再执行后续操作
     */
    boolean beforeInsert(LoginUser user, Entity e, Map<String, Object> paramData, JdbcTemplate jdbcTemplate, ActionResult ar);

    /**
     * 增加后执行，对执行后的后续行为进行收尾操作
     * 可在此方法中放弃增加操作，也可抛出异常
     * @param user  当前登录对象
     * @param e 实体配置
     * @param mapData 操作数据
     * @param jdbcTemplate jdbc
     * @param ar 操作结果，若操作结果有错误，则回滚事务
     */
    void afterInsert(LoginUser user, Entity e, Map<String, Object> mapData, JdbcTemplate jdbcTemplate, ActionResult ar);

    /**
     * 修改实体数据前所执行，可通过向ActionResult中增加错误，或抛出异常
     * @param user 当前登录对象
     * @param e 实体配置
     * @param paramData 操作数据
     * @param oldData 操作旧数据
     * @param jdbcTemplate jdbc
     * @param ar 操作结果
     * @return false，则不再执行后续操作
     */
    boolean beforeUpdate(LoginUser user, Entity e, Map<String, Object> paramData, Map<String, Object> oldData, JdbcTemplate jdbcTemplate, ActionResult ar);

    /**
     * 修改实体数据后执行，对执行后的后续行为进行收尾操作
     * 可在此方法中放弃增加操作，也可抛出异常
     * @param user  当前登录对象
     * @param e 实体配置
     * @param mapData 操作数据
     * @param oldData 操作旧数据
     * @param jdbcTemplate jdbc
     * @param ar 操作结果，若操作结果有错误，则回滚事务
     */
    void afterUpdate(LoginUser user, Entity e, Map<String, Object> mapData, Map<String, Object> oldData, JdbcTemplate jdbcTemplate, ActionResult ar);

    /**
     * 删除实体数据前所执行，可通过向ActionResult中增加错误，或抛出异常
     * @param user 当前登录对象
     * @param e 实体配置
     * @param paramData 操作数据
     * @param dbData 删除的数据
     * @param jdbcTemplate jdbc
     * @param ar 操作结果
     * @return false，则不再执行后续操作
     */
    boolean beforeDelete(LoginUser user, Entity e, Map<String, String> paramData, Map<String, Object> dbData, JdbcTemplate jdbcTemplate, ActionResult ar);

    /**
     * 删除实体数据后执行，对执行后的后续行为进行收尾操作
     * 可在此方法中放弃增加操作，也可抛出异常
     * @param user  当前登录对象
     * @param e 实体配置
     * @param paramData 操作数据
     * @param dbData 删除的数据
     * @param jdbcTemplate jdbc
     * @param ar 操作结果，若操作结果有错误，则回滚事务
     */
    void afterDelete(LoginUser user, Entity e, Map<String, String> paramData, Map<String, Object> dbData, JdbcTemplate jdbcTemplate, ActionResult ar);
}
